大家好
今天要來分享再ALV Report中如何取得我們要的資料,並經過處理最後變成我們要的格式
要把資料撈出來前一定要先有裝資料的容器,
在ABAP中就是我們的內表
Types :begin of itab , "宣告內表的結構
matnr type matnr ,
werks type werks ,
days type i , "用days作為庫齡,因為天數是整數所以用i資料類型
end of itab .
DAYA t_itab type table of itab . "根據itab結構來宣告t_itab內表
除了內表外還要需告我們資料來源會用到的表
DATA t_mbew type table of mbew . "因為要從mbew取得物料的庫存數所以宣告一個結構為mbew的表
Start of selection . "這個事件在系統處理完畫面輸入後,正式開始執行主要邏輯時觸發。可以把它理解為報表邏輯的起點。
select * from mbew into t_mbew where bwkey = p_werks and matnr in p_matnr and lbkum ne 0.
select * from mbew : 代表從mbew表中抓取符合條件的所有欄位
select single * : 加了single 代表我們只要符合條件的一行數據
select matnr lbkum :代表只抓取matnr lbkum這兩個欄位
將符合條件的資料放入表中
我們要搜尋的條件,用上面的程式碼為例,
bwkey 等於 我們輸入的廠別 p_werks & 料號在我們輸入的料號清單中 & lbkum ne 0 庫存不為0
現在我們得到的資料有 -> 根據我們想查詢的廠別當中,庫存不為0的料號清單,還有料號的庫存數量
下一步就來處理資料還有計算我們要的庫齡吧!
既然要針對每一個料號計算就要用到LOOP語法,
LOOP AT T_MBEW .
data:
lt_matnr type bapi2017_gm_material_ra occurs 0 with header line,
lt_werks type bapi2017_gm_plant_ra occurs 0 with header line,
lt_bwart type bapi2017_gm_move_type_ra occurs 0 with header line,
lt_mseg type bapi2017_gm_item_show occurs 0 with header line,
lt_mkpf type bapi2017_gm_head_02 occurs 0 with header line,
lt_rtn type bapiret2 occurs 0 with header line,
lt_pstng type bapi2017_gm_pstng_date_ra occurs 0 with header line.
clear:lt_mkpf,lt_mkpf[],lt_mseg,lt_mseg[],lt_rtn,lt_rtn[],lt_matnr,lt_matnr[].
"宣告等等要用的變數
lt_matnr-sign = 'I'.
lt_matnr-option = 'EQ'.
lt_matnr-low = t_mbew-matnr.
append lt_matnr.
call function 'BAPI_GOODSMVT_GETITEMS' "call mb51 找異動
tables
material_ra = lt_matnr
plant_ra = P_werks
move_type_ra = lt_bwart
goodsmvt_header = lt_mkpf
goodsmvt_items = lt_mseg
return = lt_rtn.
sort lt_mkpf by pstng_date descending. "將異動紀錄根據時間排序
T_ITAB-DAYS = sy-datum - lt_mkpf-pstng_date. " sy-datum 是當下日期 - 最新一筆異動日
t_itab-matnr = t_mbew-matnr . "將料號填入內表
t_itab-werks = p_werks . "將工廠別填入內表
append t_itab . "將在工作區的資料插入內表中
endloop. " 最後loop一定要搭配endloop 表示遍歷結束
LOOP AT 是 ABAP 中用來遍歷內表(Internal Table)的語句。它允許逐行讀取內表的數據並對每一行進行操作。
CALL FUNCTION 是 ABAP 中用來調用 Function Module(函數模塊)的語法。
簡單來說就是使用SAP已經幫你寫好的程式啦,
學會使用這些Function大大提升我們開發的效率,
像BAPI_GOODSMVT_GETITEMS這個function可以幫助我們取得料號的異動紀錄
不論是開發報表、FUNCTION 之前我的習慣是先GOOGLE SAP內是否有提供標準功能,
一方面是節省時間,一方面是如果客製程式太多對於後續維護上來說也會比較麻煩,
以上就是今天分享的內容!